/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.supinfo.youfood.web.servlet.admin.menu;

import com.supinfo.youfood.entity.*;
import com.supinfo.youfood.service.CategorieProduitService;
import com.supinfo.youfood.service.MenuService;
import com.supinfo.youfood.service.ProduitService;
import com.supinfo.youfood.service.RestaurantService;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;

/**
 *
 * @author TaKeO
 */
@WebServlet(name = "AddMenuServlet", urlPatterns = {"/admin/ajouter-menu"})
public class AddMenuServlet extends HttpServlet {

    @EJB
    private CategorieProduitService categorieproduitService;
    
    @EJB
    private ProduitService produitService;
    
    @EJB
    private MenuService menuService;
    
    @EJB
    private RestaurantService restoService;
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    {
        if(request.getParameter("id") != null)
        {
            Menu menu = menuService.findMenuById(new Long(request.getParameter("id")));
            request.setAttribute("menu", menu);
            
            for(int i=0; i<menu.getProduits().size(); i++)
            {
                if(menu.getProduits().get(i).getActif() == 1)
                {
                    if(menu.getProduits().get(i).getCategorie().getNom().equals("Entree"))
                    {
                        request.setAttribute("entreeMenu", menu.getProduits().get(i));
                    }
                    else
                    {
                        if(menu.getProduits().get(i).getCategorie().getNom().equals("Plat"))
                        {
                            request.setAttribute("platMenu", menu.getProduits().get(i));
                        }
                        else
                        {
                            request.setAttribute("dessertMenu", menu.getProduits().get(i));
                        }
                    }
                }
            }
        }
        
        // On set les entrées
        CategorieProduit cat = categorieproduitService.findCategorieProduitById(new Long("1"));
        List<Produit> entrees = cat.getProduits();
        request.setAttribute("entrees", entrees);
        
        // On set les plats
        List<Produit> plats = categorieproduitService.findCategorieProduitById(new Long("2")).getProduits();
        request.setAttribute("plats", plats);
        
        // On set les desserts
        List<Produit> desserts = categorieproduitService.findCategorieProduitById(new Long("3")).getProduits();
        request.setAttribute("desserts", desserts);
        
        request.getRequestDispatcher("/jsp/admin/ajouter-menu.jsp").forward(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        Menu menu;
        if(request.getParameter("id") != null)
        {
            menu = menuService.findMenuById(new Long(request.getParameter("id")));
        }
        else
        {
            menu = new Menu();
        }
        
        menu.setNom(request.getParameter("nom"));
        menu.setActif(1);
        try
        {
            menu.setPrix(new Double(request.getParameter("prix")));
        }
        catch(Exception e){ /*erreur*/ }
        menu.setDescription(request.getParameter("description"));

        List<Produit> produits = new ArrayList();
        if(!"none".equals(request.getParameter("entree")))
        {
            Long entree = new Long(request.getParameter("entree"));
            produits.add(produitService.findProduitById(entree));
        } 
        if(!"none".equals(request.getParameter("plat")))
        {
            Long plat = new Long(request.getParameter("plat"));
            produits.add(produitService.findProduitById(plat));
        }
        if(!"none".equals(request.getParameter("plat")))
        {
            Long dessert = new Long(request.getParameter("dessert"));
            produits.add(produitService.findProduitById(dessert));
        }
        menu.setProduits(produits);
        
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();

        Set<ConstraintViolation<Menu>> constraintViolations = validator.validate(menu);

        if (constraintViolations.size() > 0) 
        {
            List<String> errors = new ArrayList<String>();
            
            for (ConstraintViolation<Menu> contraintes : constraintViolations) 
            {
                errors.add(contraintes.getPropertyPath()+" "+contraintes.getMessage());
            }
            
            request.setAttribute("errors", errors);
            getServletContext().getRequestDispatcher("/jsp/admin/ajouter-menu.jsp").forward(request, response);
        }
        else
        {
            Employe employe = (Employe) request.getSession().getAttribute("currentEmp");
            if(employe.getType_employe().getDroits() < 700)
            {
                menu.addRestaurant(employe.getResto());
            }
            else
            {
                menu.setDansRestaurants(restoService.getAllResto());
            }
            
            if(request.getParameter("id") != null)
            {
                menu.setId_menu(null);
                menuService.ajouterMenu(menu);
            }
            else
            {
                menuService.ajouterMenu(menu);
            }
            
            if(employe.getType_employe().getDroits() < 700)
            {
                Restaurant resto = employe.getResto();
                resto.addMenu(menu);
                restoService.refreshResto(resto);
            }
            else
            {
                List<Restaurant> restos = restoService.getAllResto();
                for(int i=0; i<restos.size(); i++)
                {
                    restos.get(i).addMenu(menu);
                    restoService.refreshResto(restos.get(i));
                }
            }

            response.sendRedirect("/YouFood/admin/liste-menus");
        }
    }
}
